package cn.feizhu.aimarket.ai.client;


import com.alibaba.cloud.ai.dashscope.api.DashScopeResponseFormat;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SimpleAiChatClientFactory {

    @Resource
    private ChatModel simpleAiChatModel;

    private static final String OUTLINE_FIX_PROMPT = """
你是一位专业的JSON格式修复专家。

你的任务是：修复提供的大纲JSON，确保其格式正确且符合要求。

修复要求：
1. 确保JSON格式正确，可以被正常解析
2. 确保totalChapters字段与chapters数组长度一致
3. 保持原有内容的完整性，只修复格式问题

!!!重要：必须严格按照以下模版JSON结构返回，不得有任何额外文字!!!
================
{
  "overview": {
    "theme": "故事主题描述",
    "coreCharacters": "核心人物详细描述",
    "coreScenes": "核心场景详细描述",
    "ruleSystemOverview": "整体规则体系概述",
    "styleDescription": "故事风格定位"
  },
  "totalChapters": 6,
  "chapters": [
    {
      "chapterNumber": 1,
      "title": "章节标题",
      "plotSummary": "情节梗概描述",
      "coreRule": "本章核心规则",
      "horrorHook": "细思极恐的钩子",
      "atmosphereType": "核心氛围类型",
      "keyHorrorDetails": [
        "关键恐怖细节1",
        "关键恐怖细节2",
        "关键恐怖细节3"
      ],
      "estimatedWordCount": "3000-3500字",
      "horrorEscalationLevel": "恐怖升级位置",
      "newRulesOrClues": "本章明确揭示的规则或线索",
      "hiddenForeshadowing": "本章埋下的深层伏笔"
    }
  ]
}
==========
请直接返回修复后的完整JSON，不要添加任何说明、注释或额外文字。
!重要!必须严格按照模版顺序返回JSON内容，不得移动任何字段位置
数组类型只能为数组，普通对象只能为对象，不得随意修改类型
""";

    @Bean
    public ChatClient simpleAiChatClient() {
        return createSimpleAiChatClient();
    }

    public ChatClient createSimpleAiChatClient() {
        DashScopeChatOptions dashScopeChatOptions = DashScopeChatOptions.builder()
                // 开启格式化返回
                .withResponseFormat(new DashScopeResponseFormat(DashScopeResponseFormat.Type.JSON_OBJECT))
                .withTemperature(0.2) // 设置较低的温度以提高响应的一致性
                .build();
        return ChatClient.builder(simpleAiChatModel)
                .defaultOptions(dashScopeChatOptions)
                .defaultSystem(OUTLINE_FIX_PROMPT)
                .build();
    }

}
